#ifndef secsmart_tcpip_TCP_SESSION_H
#define secsmart_tcpip_TCP_SESSION_H

#include <memory>
#include <map>
#include <list>

#include "ip_addr.h"
#include "tcp_packet.h"

using namespace std;

namespace secsmart_tcpip
{
    enum SessionErrerCode
    {
        SESSION_OK = 0,
        SESSION_ERROR = 1,
    };

    typedef struct tcp_bypass_session_event_cb {
        /*
         * @brief session建立事件。
         * @param[in] session: session 信息
         * @param[in] frame_ctx: 上层业务注册时带的业务数据
         * @return:上层业务的会话信息，收到报文和结束连接的回调中会用将该信息带给上层应用
         */
        void *(*tcp_session_event_create)(void* session, void *frame_ctx);

        /*
         * @brief session收到上行数据报文的回调接口。
         * @param[in] frame_session: 上层业务的会话信息
         * @param[in] data: session 上行链路报文数据
         */
        void (*tcp_session_event_read_upstream)(void *frame_session, const tcp_stream_data_t *data);

        /*
         * @brief session。
         * @param[in] frame_session: 上层业务的会话信息
         * @param[in] data: session 下行链路报文数据
         */
        void (*tcp_session_event_read_downstream)(void *frame_session, const tcp_stream_data_t *data);

        /*
         * @brief session关闭。
         * @param[in] frame_session: 上层业务的会话信息
         */
        void (*tcp_session_event_close)(void *frame_session);
    } tcp_bypass_session_event_cb_t;

    
    class TcpBypassSessionHandler
    {
    public:
        // tcp connection事件的回调函数
        static void event_connection_data_proc(const tcp_stream_t *conn, const tcp_stream_data_t *data, void *session, void *ctx);
        static void *event_connection_create_proc(const tcp_stream_t *conn, void *ctx);
        static void event_connection_close_proc(const tcp_stream_t *conn, uint32_t close_reason, void *session, void *ctx);

        // 注册框架处理session事件的函数
        static int register_event_frame_cb(tcp_bypass_session_event_cb_t cb, void* frame_ctx);
        static tcp_bypass_session_event_cb_t m_session_event_cb;
        static void *m_frame_ctx;
    };

    class Session
    {
    public:
        // 事件处理
        void event_session_create(const tcp_stream_t *conn, void *app_ctx);
        void event_session_read_upstream(const tcp_stream_data_t *data);
        void event_session_read_downstream(const tcp_stream_data_t *data);
        void event_session_close();

        bool do_close_connection(); // 上层业务触发断开连接
        bool do_disable_connection(); // 该连接的数据不再需要上送给业务
    private:
        tcp_stream_t* m_conn;
        void *m_frame_session;
        shared_ptr<void> m_frame_session_sptr;
    };
}

#endif /* secsmart_tcpip_TCP_SESSION_H */


